package br.fatec.controller;

import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Iterator;

import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

import br.fatec.model.entity.Sinonimo;
import br.fatec.util.AppEnum;
import br.fatec.util.Log;
import br.fatec.view.FrmSinonimo;

public class SinonimoController implements ActionListener, KeyListener
{
	private FrmSinonimo frmSinonimo;
	
	public SinonimoController(FrmSinonimo frmSinonimo)
	{
		this.frmSinonimo = frmSinonimo;
	}
	
	@Override
	public void actionPerformed(ActionEvent e)
	{
		frmSinonimo.setCursor(new Cursor(Cursor.WAIT_CURSOR));
		if (e.getActionCommand() == AppEnum.ADICIONARITEMLISTA.name())
			adicionarSinonimo();
		else if (e.getActionCommand() == AppEnum.REMOVERITEMLISTA.name())
			removerSinonimo();
		else if (e.getActionCommand() == AppEnum.CONFIRMAR.name())
			confirmar();
		else if (e.getActionCommand() == AppEnum.SAIR.name())
			sair();
		frmSinonimo.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
	}
	
	@Override
	public void keyPressed(KeyEvent e) 
	{
		frmSinonimo.setCursor(new Cursor(Cursor.WAIT_CURSOR));
		if (e.getKeyCode() == KeyEvent.VK_DELETE)
			removerSinonimo();
		frmSinonimo.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
	}
	@Override
	public void keyReleased(KeyEvent arg0) {}
	@Override
	public void keyTyped(KeyEvent arg0) {}
	
	public void carregarSinonimos()
	{
		try
		{
			DefaultTableModel modelo = (DefaultTableModel)frmSinonimo.tblSinonimos.getModel();
			
			for (Sinonimo s : frmSinonimo.sinonimos)
			{
				String[] linha = new String[2];
				linha[0] = String.valueOf(s.getCodigo());
				linha[1] = s.getNome();
				modelo.addRow(linha);
			}
		}
		catch (Exception e)
		{
			Log.gravarLog(e);
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, "Ocorreu um erro ao carregar a tela de sinonimos.", "Flamel", JOptionPane.ERROR_MESSAGE);
		}
	}
	
	private void adicionarSinonimo()
	{
		try
		{
			String[] linha = new String[2];
			linha[0] = "null";
			linha[1] = frmSinonimo.txtNome.getText();
			
			((DefaultTableModel) frmSinonimo.tblSinonimos.getModel()).addRow(linha);
			
			Sinonimo sinonimo = new Sinonimo();
			sinonimo.setNome(linha[1]);
			sinonimo.setCriadoPor(frmSinonimo.userCadastro);
			frmSinonimo.sinonimos.add(sinonimo);
			
			frmSinonimo.txtNome.setText("");
		}
		catch (Exception e)
		{
			Log.gravarLog(e);
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, "Ocorreu um erro ao adicionar um sinonimo.", "Flamel", JOptionPane.ERROR_MESSAGE);
		}
	}
	
	private void removerSinonimo()
	{
		try
		{
			int index;
			String cod;
			
			index = frmSinonimo.tblSinonimos.getSelectedRow();
			if (index < 0)
				return;
			
			cod = frmSinonimo.tblSinonimos.getValueAt(index, 0).toString();
			if (cod != "null")
				frmSinonimo.sinonimosExcluir.add(Integer.parseInt(cod));
			
			((DefaultTableModel) frmSinonimo.tblSinonimos.getModel()).removeRow(index);
			
			Iterator<Sinonimo> it = frmSinonimo.sinonimos.iterator();
			for (int i = 0; it.hasNext(); i++)
			{
				it.next();
				if (i == index)
					it.remove();
			}
		}
		catch (Exception e)
		{
			Log.gravarLog(e);
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, "Ocorreu um erro ao remover um sinonimo.", "Flamel", JOptionPane.ERROR_MESSAGE);
		}
	}
	
	private void confirmar()
	{
		frmSinonimo.isOk = true;
		frmSinonimo.dispose();
	}
	
	private void sair()
	{
		frmSinonimo.isOk = false;
		frmSinonimo.dispose();
	}
}
